#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>

// 进程等待---1，wait 2，waitpid
// 进程等待的两大用途：1，回收僵尸进程 2，获取子进程的退出信息
//
// 
int main(int argc,char* argv[],char* env[])
{
    //进程创建
    pid_t id=fork();

    if(id==-1)
    {
        perror("fork");
        exit(1);
    }
    else if(id==0)
    {
        int i=5;
        while(i--)
        {
            printf("子进程: pid:%d ppid:%d\n",getpid(),getppid());
            sleep(1);
            //int* p=NULL;
            //*p=0;段错误 11信号
            //
            //int x=10/0; 语法错误
        }

        exit(105);
    }
    else 
    {
        //while(1);
        int status=0;
        printf("父进程: pid:%d ppid:%d\n",getpid(),getppid());

        sleep(9);
        //pid_t ret=wait(&status);

        pid_t ret=waitpid(id,&status,0);

        printf("等待的子进程是: %d,退出码: %d,信号: %d\n",ret,(status>>8)&0xFF,status&0x7f);
        while(1)
        {

        }
    }
    


    return 0;
}



//void func()
//{
//    printf("-------------------------");
//
//    sleep(3);
//    
//
//    //exit(0);---库函数
//    // _exit(1);---系统调用
//    // 说明缓存区是在用户层而并非在内核层
//}
//
//
//int main(int argc,char* argv[],char* env[])
//{
//    
//    printf("进程：pid: %d ppid: %d\n",getpid(),getppid());
//    
//    func();
//
//    return 0;
//}


//int main(int argc,char* argv[],char* env[])
//{
// //    printf("我是一个进程\n");
 //    pid_t id=fork();

 //    if(id==-1)
 //    {
 //        perror("fork");
 //        exit(1);
 //    }
 //    else if(id==0)
 //    {
 //       printf("我是子进程 pid: %d \n",getpid());
 //       // sleep(6);

 //       while(1)
 //       {

 //       }
 //       //int* p=NULL;
 //       //*p=00;

 //       //exit(6);
 //    }
 //    else 
 //    {
 //       int status=0;

 //       pid_t ret=waitpid(id,&status,0);//阻塞式等待
 //       printf("我是父进程，pid:%d 退出码：%d 信号：%d",ret,(status>>8)&0xFF,(status)&0x7F);

 //    }



 //   return 3;
//}//
